package com.w7vm.menuweb.facade;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.w7vm.menuweb.dao.RestauranteFilialDAO;
import com.w7vm.menuweb.dao.RestauranteFilialInfraestruturaDAO;
import com.w7vm.menuweb.dao.RestauranteSedeInfraestruturaDAO;
import com.w7vm.menuweb.entity.RestauranteCulinariaSy;
import com.w7vm.menuweb.entity.RestauranteEstruturaSy;
import com.w7vm.menuweb.entity.RestauranteFilialEnderecoWeb;
import com.w7vm.menuweb.entity.RestauranteFilialInfraestruturaWeb;
import com.w7vm.menuweb.entity.RestauranteFilialWeb;
import com.w7vm.menuweb.entity.RestauranteServicoSy;
import com.w7vm.menuweb.entity.RestauranteTipoSy;
import com.w7vm.menuweb.utility.ConstantesEJB;
import com.w7vm.menuweb.vo.EnderecoVO;
import com.w7vm.menuweb.vo.RestauranteVO;


@Stateless(name="restauranteFilialEJB")
@Remote(RestauranteFilialFacade.class)

public class RestauranteFilialFacadeImp implements RestauranteFilialFacade {

	@EJB
	private RestauranteFilialDAO filialDAO;
	@EJB
	private RestauranteFilialInfraestruturaDAO filialinfraDAO; 
	
	private RestauranteFilialEnderecoWeb filialEnderecoEntity = new RestauranteFilialEnderecoWeb();
	private RestauranteFilialInfraestruturaWeb filialInfraEntity = new RestauranteFilialInfraestruturaWeb(); 
	private RestauranteEstruturaSy restEstSYS = new RestauranteEstruturaSy(); 
	private RestauranteTipoSy tipoEntity = new RestauranteTipoSy();
	private RestauranteServicoSy servicoEntity = new RestauranteServicoSy();
	private RestauranteCulinariaSy culinariaEntity = new RestauranteCulinariaSy();
	ConstantesEJB constObj = new ConstantesEJB();

	private RestauranteVO restauranteVO = new RestauranteVO(); 
	private EnderecoVO enderecoVO = new EnderecoVO(); 
	
//======================== OPERACAO CRUD =======================================================

	@Override
	public List<RestauranteFilialWeb> findFilialByIDMatriz(int idRestaurante) {
		return filialDAO.findFilialByIDMatriz(idRestaurante);
		
	}

	@Override
	public RestauranteFilialWeb saveRestauranteFilial(
			RestauranteFilialWeb entity) {
		return filialDAO.saveRestauranteFilial(entity);
	}

	@Override
	public RestauranteFilialEnderecoWeb saveEnderecoFilial(
			RestauranteFilialEnderecoWeb entity) {
		// TODO Auto-generated method stub
		return filialDAO.saveEnderecoFilial(entity);
	}

	@Override
	public RestauranteFilialWeb findRestauranteFilialByID(int idRestaurante) {
		return filialDAO.findFilialByID(idRestaurante);
	}

	@Override
	public RestauranteFilialWeb updateRestauranteFilial(
			RestauranteFilialWeb filialEntity) {
		return filialDAO.mergeUpdate(filialEntity);
	}

	@Override
	public RestauranteFilialInfraestruturaWeb saveInfraFilial(
			RestauranteFilialInfraestruturaWeb entity) {
		return filialDAO.saveInfraFilial(entity);
	}

	@Override
	public List<RestauranteFilialWeb>  findRestauranteFilialByCNPJ(String cnpj) {
		return filialDAO.findRestauranteFilialByCNPJ(cnpj);
	}
	
	@Override
	public void deleteRestauranteFilial(RestauranteFilialInfraestruturaWeb infraOjb){
		filialinfraDAO.deleteInfraestrutura(infraOjb);
		
	}
	
	
//========================== OPERACAO SET VIEW OBJECT - VO =========================================================
		 /*
		 * Metodo: setFilialSedeVO()
		 * 
		 * Tipo: ENTITY - View Object
		 * 
		 * Funcionalidade: utilizado no momento da abertura da tela, para carregar dados no ViewObject
		 *  
		 * */
		public RestauranteVO setRestauranteFilialVO(RestauranteFilialWeb filialEntity){
			
			// RestauranteSede
			restauranteVO.setIdRestaurante(filialEntity.getIdRestauranteFilialWeb());
			restauranteVO.setProprietario(filialEntity.getProprietario());
			
			if(filialEntity.getStatus() == constObj.ATIVO){
				restauranteVO.setStatus(constObj.ATIVOs);
			} else if(filialEntity.getStatus() == constObj.INATIVO){
				restauranteVO.setStatus(constObj.INATIVOs);
			}
			
			restauranteVO.setFone1(filialEntity.getFone1());
			restauranteVO.setFone2(filialEntity.getFone2());
			restauranteVO.setMail(filialEntity.getMail());
			restauranteVO.setDataInc(filialEntity.getDataInc());
			
			// RestauranteSede - Juridico
			restauranteVO.setCnpj(filialEntity.getRestauranteFilialJuridicoWeb().getCnpj());
			restauranteVO.setInsEstadual(filialEntity.getRestauranteFilialJuridicoWeb().getInsEstadual());
			restauranteVO.setRzSocial(filialEntity.getRestauranteFilialJuridicoWeb().getRzSocial());
			restauranteVO.setNomeFantasia(filialEntity.getRestauranteFilialJuridicoWeb().getNomeFantasiaFilial());
			
			// RestauranteSede - Tipo
			restauranteVO.setIdTipoRestaurante(filialEntity.getRestauranteTipoSy().getIdRestauranteTipoSys());
			restauranteVO.setNomeTipo(filialEntity.getRestauranteTipoSy().getTipo());

			// RestauranteSede - Culinaria
			restauranteVO.setIdCulinariaRestaurante(filialEntity.getRestauranteCulinariaSy().getIdRestauranteCulinariaSys());
			restauranteVO.setNomeCulinaria(filialEntity.getRestauranteCulinariaSy().getCulinaria());

			// RestauranteSede - Servico
			restauranteVO.setIdServicoRestaurante(filialEntity.getRestauranteServicoSy().getIdRestauranteServicoSys());
			restauranteVO.setNomeServico(filialEntity.getRestauranteServicoSy().getServico());
			return restauranteVO;
		}

		@Override
		public Set<RestauranteEstruturaSy> setRestauranteFilialEstruturaVO(RestauranteFilialWeb filialEntity) {
			
			Set<RestauranteEstruturaSy> estruturaSysL = new HashSet<RestauranteEstruturaSy>();
			
			// RestauranteSede - Infraestrutura
			for(RestauranteFilialInfraestruturaWeb infObj: filialEntity.getRestauranteFilialInfraestruturaWebs()){
				restEstSYS = new RestauranteEstruturaSy();
				restEstSYS.setIdRestauranteEstruturaSys(infObj.getRestauranteEstruturaSy().getIdRestauranteEstruturaSys());
				restEstSYS.setEstrutura(infObj.getRestauranteEstruturaSy().getEstrutura());
				estruturaSysL.add(restEstSYS);	
			}
			return estruturaSysL;
		}

		@Override
		public EnderecoVO setRestauranteFilialEnderecoVO(RestauranteFilialWeb filialEntity) {
			// RestauranteSede - Endereco
			for(RestauranteFilialEnderecoWeb endObj: filialEntity.getRestauranteFilialEnderecoWebs()){
				enderecoVO.setIdEndereco(endObj.getIdRestauranteFilialEnderecoWeb());
				enderecoVO.setLogradouro(endObj.getLogradouro());
				enderecoVO.setBairro(endObj.getBairro());
				enderecoVO.setNumero(endObj.getNumero());
				enderecoVO.setCep(endObj.getCep());
				enderecoVO.setEstado(endObj.getEstado());
				enderecoVO.setCidade(endObj.getCidade());
			}
			return enderecoVO;
		}
		
//========================== OPERACAO SET ENTITY =========================================================

		/*
		* Metodo: setRestauranteSedeEntity()
		* 
		* Tipo: View Object - ENTITY
		* 
		* Funcionalidade: utilizado no momento da persistencia dos dados na table carrega dados para ENTITIY
		*  
		* */
		
		public RestauranteFilialWeb setRestauranteFilialEntity(RestauranteVO restauranteVO, 
				RestauranteFilialWeb filialEntity)
		{
			// RestauranteSede
			filialEntity.setIdRestauranteFilialWeb(restauranteVO.getIdRestaurante());
			filialEntity.setProprietario(restauranteVO.getProprietario());
			filialEntity.setFone1(restauranteVO.getFone1());
			filialEntity.setFone2(restauranteVO.getFone2());
			filialEntity.setMail(restauranteVO.getMail());
			filialEntity.setDataInc(restauranteVO.getDataInc());
			Date dtnow = new Date();
			filialEntity.setDtAlt(dtnow);
			
			// RestauranteSede - Tipo
			tipoEntity.setIdRestauranteTipoSys(restauranteVO.getIdTipoRestaurante());
			filialEntity.setRestauranteTipoSy(tipoEntity);
			
			// RestauranteSede - Culinaria
			culinariaEntity.setIdRestauranteCulinariaSys(restauranteVO.getIdCulinariaRestaurante());
			filialEntity.setRestauranteCulinariaSy(culinariaEntity);
			
			// RestauranteSede - Servico
			servicoEntity.setIdRestauranteServicoSys(restauranteVO.getIdServicoRestaurante());
			filialEntity.setRestauranteServicoSy(servicoEntity);
			
			filialEntity.getRestauranteFilialJuridicoWeb().setCnpj(restauranteVO.getCnpj());
			filialEntity.getRestauranteFilialJuridicoWeb().setInsEstadual(restauranteVO.getInsEstadual());
			filialEntity.getRestauranteFilialJuridicoWeb().setRzSocial(restauranteVO.getRzSocial());
			filialEntity.getRestauranteFilialJuridicoWeb().setNomeFantasiaFilial(restauranteVO.getNomeFantasia());
			
			return filialEntity;
		}

		public RestauranteFilialEnderecoWeb setRestauranteFilialEnderecoEntity(EnderecoVO enderecoVO){
			filialEnderecoEntity.setIdRestauranteFilialEnderecoWeb(enderecoVO.getIdEndereco());
			filialEnderecoEntity.setLogradouro(enderecoVO.getLogradouro());
			filialEnderecoEntity.setBairro(enderecoVO.getBairro());
			filialEnderecoEntity.setNumero(enderecoVO.getNumero());
			filialEnderecoEntity.setCep(enderecoVO.getCep());
			filialEnderecoEntity.setEstado(enderecoVO.getEstado());
			filialEnderecoEntity.setCidade(enderecoVO.getCidade());
			
			return filialEnderecoEntity;
		}
		
		public Set<RestauranteFilialInfraestruturaWeb> setRestauranteFilialInfraestruturaEntity(List<RestauranteEstruturaSy> estruturaPickerView,
				RestauranteFilialWeb restObj){
			Set<RestauranteFilialInfraestruturaWeb> infraSedeL = new HashSet<RestauranteFilialInfraestruturaWeb>();

			for(RestauranteEstruturaSy estrutura : estruturaPickerView){
				System.out.println("ID RestauranteEstruturaSys "+ estrutura.getIdRestauranteEstruturaSys());
				restEstSYS.setIdRestauranteEstruturaSys(estrutura.getIdRestauranteEstruturaSys());
				filialInfraEntity.setRestauranteEstruturaSy(restEstSYS);
				
				System.out.println("ID ESTRUTURA ====== "+ filialInfraEntity.getRestauranteEstruturaSy().getIdRestauranteEstruturaSys());

				filialInfraEntity.setRestauranteFilialWeb(restObj);
				infraSedeL.add(filialInfraEntity);
				restEstSYS = new RestauranteEstruturaSy();
				filialInfraEntity = new RestauranteFilialInfraestruturaWeb();
			}
			System.out.println("Tamanho EStrutura Filial  "+ infraSedeL.size());
			return infraSedeL;
		}

}
